package demo.service;

import org.aspectj.lang.*;
import java.util.Arrays;

public class FourAdviceTest {
    public Object processTx(ProceedingJoinPoint jp) throws java.lang.Throwable
    {
        System.out.println("Around增强 执行目标之前 模拟开始事物");
        // 访问执行目标方法的参数
        Object[] args = jp.getArgs( );
        // 当执行目标方法的参数存在，
        //且第一个参数是字符串参数
        if (args != null && args.length > 0 && args[0].getClass() == String.class)
        {
            // 修改目标方法调用参数的第一个参数
            args[0] ="[增加的前缀]" + args[0];
        }
        
        //执行目标方法，并保存目标方法执行后的返回值
        Object rvt = jp.proceed(args);
        System.out.println("Around增强: 执行目标方法之后，模拟结束事务...");
        // 如果rvt的类型是Integer，将rvt改为它的平方
        if(rvt != null && rvt instanceof Integer)
        {
            rvt = (Integer)rvt *(Integer)rvt;
        }
        return rvt;

    }

    public void authority(JoinPoint jp)
    {
        System.out.println("@Before增强: 模拟执行权限检查");
        System.out.println("Before增强:被植入增强处理的目标方法为" + jp.getSignature().getName() + 
        " 参数为 " + Arrays.toString(jp.getArgs()) + 
        " 被植入增强处理的目标对象为" + jp.getTarget());

        return;
    }

    public void log(JoinPoint jp, Object rvt)
    {
        System.out.println("AfterReturning增强:获取目标方法返回值" + rvt);
        System.out.println("AfterReturning增强:模拟记录日志功能" );
        System.out.println("AfterReturning增强:被植入增强处理的目标方法为" + jp.getSignature().getName() + 
        " 参数为 " + Arrays.toString(jp.getArgs()) + 
        " 被植入增强处理的目标对象为" + jp.getTarget());

        return;

    }

    public void release(JoinPoint jp)
    {
        System.out.println("After增强:模拟方法结束后释放资源");
        System.out.println("After增强:被植入增强处理的目标方法为" + jp.getSignature().getName() + 
        " 参数为 " + Arrays.toString(jp.getArgs()) + 
        " 被植入增强处理的目标对象为" + jp.getTarget());
        
    }
}
